#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100

typedef char *datatype;


// 链队结构体
typedef struct node
{
    datatype data;
    struct node *next;
} Node;

typedef struct
{
    Node *front, *rear;
} LinkQueue;

// 初始化链队
LinkQueue *init_queue()
{
    LinkQueue *q;
    q = (LinkQueue *)malloc(sizeof(LinkQueue));
    q->front = q->rear = NULL;
    return q;
}

// 入队操作
int push(LinkQueue *q, datatype e)
{
    Node *p;
    p = (Node *)malloc(sizeof(Node));
    p->data = e;
    p->next = NULL;
    if (q->rear == NULL)
    {
        q->front = q->rear = p;
    }
    else
    {
        q->rear->next = p;
        q->rear = p;
    }
    return 1;
}
// 出队操作
int pop(LinkQueue *q, datatype *e)
{
    Node *p;
    if (q->front == NULL)
    {
        printf("队列为空，不能出队！\n");
        return 0;
    }
    *e = q->front->data;
    p = q->front;
    q->front = q->front->next;
    if (q->front == NULL)
    {
        q->rear = NULL;
    }
    free(p);
    return 1;
}

// 判断队列是否为空
int empty_queue(LinkQueue *q)
{
    return q->front == NULL;
}

// 获取队头元素值
int peek(LinkQueue *q, datatype *e)
{
    if (q->front == NULL)
    {
        printf("队列为空，没有队头元素！\n");
        return 0;
    }
    *e = q->front->data;
    return 1;
}

// // 测试主函数
// int main()
// {
//     LinkQueue *q;
//     q = init_queue();
//     in_queue(q, 'a');
//     in_queue(q, 'b');
//     in_queue(q, 'c');
//     in_queue(q, 'd');
//     in_queue(q, 'e');
//     in_queue(q, 'f');
//     in_queue(q, 'g');
//     in_queue(q, 'h');
//     in_queue(q, 'i');
//     in_queue(q, 'j');
//     in_queue(q, 'k');
//     in_queue(q, 'l');
//     in_queue(q, 'm');
//     in_queue(q, 'n');
//     in_queue(q, 'o');
//     in_queue(q, 'p');
//     in_queue(q, 'q');
//     in_queue(q, 'r');
//     in_queue(q, 's');
//     in_queue(q, 't');
//     in_queue(q, 'u');
//     in_queue(q, 'v');
//     in_queue(q, 'w');
//     in_queue(q, 'x');
//     in_queue(q, 'y');
//     in_queue(q, 'z');
//     datatype e;
//     while (!empty_queue(q))
//     {
//         out_queue(q, &e);
//         printf("%c ", e);
//     }
//     printf("\n");
//     system("pause");
//     return 0;
// }

